package com.ekgc.addressbook.base.util;

import com.fasterxml.jackson.databind.json.JsonMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

/**
 * <b> Redis 工具类 </b>
 *
 * @author FanSheng
 * @version 1.0
 */
@Component("redisUtil")
public class RedisUtil {
	@Autowired
	private StringRedisTemplate redisTemplate;
	private static final JsonMapper JSON_MAPPER = new JsonMapper();

	/**
	 * <b>将数据存储到 Redis 中</b>
	 * @param key
	 * @param value
	 * @param expireSec
	 * @return
	 */
	public boolean saveToRedis(String key, Object value,Long expireSec) throws Exception {
		// 判断所给的 key 和 value 是否都是有效且存在的
		if (!Optional.ofNullable(key).isPresent() || "".equals(key.trim()) || !Optional.ofNullable(value).isPresent() || "".equals(value.toString().trim())) {
			// 为给定有效的值
			throw new RuntimeException("为给定有效的 key 或 value 信息");
		}

		try {
			// 将对应 Object 类型数据转换为 JSON
			String valueJSON = JSON_MAPPER.writeValueAsString(value);
			// 将数据存储到 Redis 中
			redisTemplate.opsForValue().set(key, valueJSON);
			// 判断是否给定了有效的存储时间
			if (Optional.ofNullable(expireSec).isPresent() && expireSec > 0) {
				// 有效
				redisTemplate.expire(key, expireSec, TimeUnit.SECONDS);
			}
			return true;
		}catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * <b>根据 key 从 Redis 中获得数据</b>
	 * @param key
	 * @param valueType
	 * @return
	 * @throws Exception
	 */
	public Object getFromRedis(String key,Class valueType) throws Exception{
		// 判断是否获得了有效的 key 或 valueType
		if (!Optional.ofNullable(key).isPresent() || "".equals(key.trim()) || !Optional.ofNullable(valueType).isPresent() || "".equals(valueType.toString())) {
			// 为给定有效数据
			throw new RuntimeException("未给定有效的 key 或者 valueType");
		}
		
		// 通过 Redis 获取对应的数据
		String valueJSON = redisTemplate.opsForValue().get(key);
		// 判断是否获得了有效结果
		if (Optional.ofNullable(valueJSON).isPresent() && !"".equals(valueJSON.trim())) {
			// 获得有效数据
			return JSON_MAPPER.readValue(valueJSON,valueType);
		}
		return null;
	}

	/**
	 * <b>根据给定的 key 从 Redis 中删除数据</b>
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public boolean deleteFromRedis(String key) throws Exception{
		if (!Optional.ofNullable(key).isPresent() || "".equals(key.trim())) {
			throw new RuntimeException("为给定有效的 key 信息");
		}
		return redisTemplate.delete(key);
	}
}
